/*
 * FileName: LoadJarTest.java
 * Author:   zzw
 * Date:     2018年05月05日
 * Description: 加载jar
 */
package com.zzw.basic.classloader;

import org.springframework.web.servlet.DispatcherServlet;

import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

/**
 * 〈加载jar〉<br>
 * 〈加载jar〉
 *
 * @author zzw
 * @see [相关类/方法]（可选）
 * @since [产品/模块版本]（可选）
 */
public class LoadJarTest {

    public static void main(String[] args) {
        // 包路径定义
        URL urls = null;
        try {
            urls = new URL("file:/C:\\Users\\Administrator\\.m2\\repository\\org\\springframework\\spring-webmvc\\4.3.14.RELEASE\\spring-webmvc-4.3.14.RELEASE.jar");
            //GetPI.class
            URLClassLoader urlLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
            Class<URLClassLoader> sysclass = URLClassLoader.class;
            Method method = sysclass.getDeclaredMethod("addURL", new Class[]{URL.class});
            method.setAccessible(true);
            method.invoke(urlLoader, urls);
            method.invoke(urlLoader, new URL("file:/C:\\Users\\Administrator\\.m2\\repository\\javax\\servlet\\javax.servlet-api\\3.1.0\\javax.servlet-api-3.1.0.jar"));
            /*
             * 实例化一个对象 ，这个类(yerasel.GetPI)可以是串行化传来的多个类的一个，运行时才知道需要哪个类
             * 或者从xml 配置文件中获得字符串
             * 例如
             * String className = readfromXMlConfig;//从xml 配置文件中获得字符串
             * class c = Class.forName(className);
             * factory = (ExampleInterface)c.newInstance();
             * 上面代码已经不存在类名称，它的优点是，无论Example类怎么变化，上述代码不变，
             * 甚至可以更换Example的兄弟类Example2 , Example3 , Example4……，只要他们继承ExampleInterface就可以。
             */
            // 输入类名
            String className = "org.springframework.web.servlet.DispatcherServlet";
            Class<?> tidyClass = urlLoader.loadClass(className);
            Object obj = tidyClass.newInstance();
            DispatcherServlet dispatcherServlet = DispatcherServlet.class.cast(obj);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
